#include "Blockqueue.hpp"
#include "Thread.hpp"
#include "Task.hpp"
#include <time.h>
#include <functional>

using namespace ThreadModule;
using namespace BlockQueueModule;

using func_t = std::function<void()>;

void test(){
    std::cout << "hahahahahah" << std::endl;
}

void *Productor(Blockqueue<func_t> &bq)
{
    int data = 10;
    while (true)
    {
        sleep(2); // 先让消费者进入等待
        func_t t = test;
        printf("生产者生产了一个任务\n");
        bq.Equeue(t);
    }
}
void *Consumer(Blockqueue<func_t> &bq)
{
    while (true)
    {
        func_t t;
        bq.Pop(&t);
        t();
        sleep(1); //执行任务所需要的时间
        printf("消费者执行了一个任务\n");
    }
}

int main()
{
    srand(time(nullptr) ^ getpid());
    Blockqueue<func_t> *bq = new Blockqueue<func_t>();
    Thread<Blockqueue<func_t>> p1(Productor, *bq);
    // Thread<Blockqueue<int>> p2(Productor, *bq);
    Thread<Blockqueue<func_t>> c1(Consumer, *bq);
    // Thread<Blockqueue<int>> c2(Consumer, *bq);
    // Thread<Blockqueue<int>> c3(Consumer, *bq);

    p1.Start();
    // p2.Start();

    c1.Start();
    // c2.Start();
    // c3.Start();

    p1.Join();
    // p2.Join();

    c1.Join();
    // c2.Join();
    // c3.Join();
    delete bq;
    return 0;
}